﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;

namespace MyVideoTek
{
    public partial class synchronisation : Form
    {
        //Attributs
        List<String> lesDossier;
        List<String> filmPlusieurCd;
        List<Image> lesImages = new List<Image>();
        int numberDownloadFinished = 0;

        //Constructeur
        public synchronisation(List<String> folderList)
        {
            InitializeComponent();
            filmPlusieurCd = new List<string>();
            lesDossier = new List<string>();
            lesDossier = folderList;
        }

        private void RecupereListFilm()
        {
            //Declaration
            ApiAllocine allocine = new ApiAllocine();
            GestionDossierFichier manipulateFile = new GestionDossierFichier();
            List<String> lesFichiers = new List<string>();
            List<GenreMv> lesGenres = new List<GenreMv>();

            for (int j = 0; j < lesDossier.Count(); ++j)
            {
                string[] lesFilms;
                string nomFilm;
                string extentionFilm;
                lesFilms = Directory.GetFileSystemEntries(lesDossier[j]);

                //Paramètrage de la progress bar
                ProgressBar.Step = 1;
                ProgressBar.Minimum = 0;
                ProgressBar.Maximum = lesFilms.Count();

                //Parcours de tout les films
                for (int k = 0; k < lesFilms.Count(); ++k)
                {
                    if (!Directory.Exists(lesFilms.ElementAt(k)))
                    {
                        //Recupère le nom du fichier
                        FileInfo unFichier = new FileInfo(lesFilms.ElementAt(k));

                        if (unFichier.Extension == ".avi" | unFichier.Extension == ".mkv")
                        {
                            //Nom du fichier sans extention
                            nomFilm = System.IO.Path.GetFileNameWithoutExtension(unFichier.ToString());

                            //Met de coté l'extention du fichier
                            extentionFilm = System.IO.Path.GetExtension(unFichier.ToString());

                            //S'il y n'a pas de "CD1" ou "Cd2" ... on continu
                            if (!VerifFilmPlusieurPart(nomFilm))
                            {
                                //Récupère le path du film
                                lesFichiers.Add(lesFilms.ElementAt(k));

                                //Clear le titre du film
                                string clearMovieName;
                                clearMovieName = manipulateFile.ClearMovieName(nomFilm);

                                //Affichage
                                LabelTitreFilm.Text = clearMovieName.ToLower();

                                Application.DoEvents();

                                lesGenres.Clear();

                                //Recupère les infos du film dans une structure
                                bool checkApi = allocine.GetIdFilmByName(RemoveDiacritics(clearMovieName));

                                //Si un film à été trouvé = true
                                if (checkApi)
                                {
                                    //Récupére le film
                                    Movie monFilm = allocine.UnFilm;

                                    //Parcours des genres et insertion en BDD
                                    foreach (Genre unGenre in monFilm.Genre)
                                    {
                                        GenreMv nouveauGenre = new GenreMv(unGenre.NomGenre);
                                        lesGenres.Add(nouveauGenre);
                                    }

                                    string poster = null;
                                    if (monFilm.Poster != null)
                                    {
                                        poster = monFilm.Poster.Href;

                                        //Ajout a la liste d'image à télécharger
                                        lesImages.Add(allocine.UneImage);
                                    }


                                    //Enregistre le film
                                    Film unFilm = new Film(allocine.TitreFilm, monFilm.Synopsis, monFilm.Code + ".jpg", poster, lesGenres, monFilm.ProductionYear.ToString());

                                    //Parcours des fichier
                                    foreach (String fichier in lesFichiers)
                                    {
                                        Fichier unFIchier = new Fichier(fichier, "1", unFilm.IdFilm);
                                    }
                                }
                                //Le film n'a pas été trouvé, on enregistre les données connu
                                else
                                {
                                    Film unFilm = new Film(allocine.TitreFilm);

                                    //Parcours des fichier
                                    foreach (String fichier in lesFichiers)
                                    {
                                        Fichier unFIchier = new Fichier(fichier, "1", unFilm.IdFilm);
                                    }
                                }
                            }
                            else
                            {
                                //Met de cote les films en plusieurs partie // seront traités plus tard
                                filmPlusieurCd.Add(lesFilms.ElementAt(k));
                            }
                        }
                    }
                    //Incrémente la progress bar
                    ProgressBar.PerformStep();
                }
            }

            //Téléchargement des images
            DownloadPicture();

            //Libère la mémoire
          //  this.Dispose();
        }

        private bool VerifFilmPlusieurPart(string nomFilm)
        {
            if (Regex.Match(nomFilm, "[c-dC-D]+[0-9]").Success)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void synchronisation_Shown(object sender, EventArgs e)
        {
            RecupereListFilm();
        }

        //Supprime les accent d'une chaine
        public static string RemoveDiacritics(string input)
        {
            string formD = input.Normalize(NormalizationForm.FormD);
            StringBuilder sbNoDiacritics = new StringBuilder();
            foreach (char c in formD)
            {
                if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
                    sbNoDiacritics.Append(c);
            }
            string noDiacritics = sbNoDiacritics.ToString().Normalize(NormalizationForm.FormC);
            return noDiacritics;
        }

        private void DownloadPicture()
        {
            //Paramètrage de la progress bar
              progressBarImage.Step = 1;
              progressBarImage.Minimum = 0;
              progressBarImage.Maximum = lesImages.Count();


            foreach (Image uneImage in lesImages)
            {
                Application.DoEvents();

                //Si l'image n'à pas déjà été téléchargé
                if (!File.Exists(uneImage.Destination))
                {
                  //  DownloadFile(uneImage.Href, uneImage.Destination);
                    System.Net.WebClient _WebClient = new System.Net.WebClient();
                    _WebClient.DownloadFileCompleted += new AsyncCompletedEventHandler(_DownloadFileCompleted);
                    _WebClient.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(_DownloadProgressChanged);
                    _WebClient.DownloadFileAsync(new Uri(uneImage.Href), uneImage.Destination);

                    /*      try
                          {
                              WebClient client = new WebClient();
                              // Starts the download
                              client.DownloadFileAsync(new Uri(uneImage.Href), uneImage.Destination);
                              //Libère la mémoire
                              client.Dispose();
                          }
                          catch (WebException ex)
                          {
                              //do some error handling stuff
                              MessageBox.Show(ex.ToString());
                          }
                      }*/

                    //progressBarImage.PerformStep();
                }
            }
        }

        public static ManualResetEvent ma = new ManualResetEvent(false);



        public void DownloadFile(string _URL, string _SaveAs)
        {
            try
            {
                System.Net.WebClient _WebClient = new System.Net.WebClient();
                // Downloads the resource with the specified URI to a local file.
                _WebClient.DownloadFile(_URL, _SaveAs);
            }
            catch (Exception _Exception)
            {
                // Error
                Console.WriteLine("Exception caught in process: {0}", _Exception.ToString());
            }
        }

        // Occurs when an asynchronous file download operation completes.
        private void _DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            progressBarImage.PerformStep();
            numberDownloadFinished = numberDownloadFinished + 1;


            if (numberDownloadFinished == lesImages.Count())
            {
                this.Dispose();
            }

          //  lesImages.Count();
         //   MessageBox.Show("Download completed");
        }

        // Occurs when an asynchronous download operation successfully transfers some or all of the data.
        private void _DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
        {
            // Update progress bar
            
        }


        // download button click event
        private void download_button_Click(object sender, EventArgs e)
        {
            // Disable download button to avoid clicking again while downloading the file
         //   download_button.Enabled = false;

            // Downloads, to a local file, the resource with the specified URI. 
            // This method does not block the calling thread.
      //      System.Net.WebClient _WebClient = new System.Net.WebClient();
       //     _WebClient.DownloadFileCompleted += new AsyncCompletedEventHandler(_DownloadFileCompleted);
       //     _WebClient.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(_DownloadProgressChanged);
       //     _WebClient.DownloadFileAsync(new Uri("http://www.youdomain.com/sample-file.zip"), @"C:\sample-file.zip");
        }
       


    }
}
